package pessoal;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import util.Conexao;
import util.ErroAcessoRepositorioException;

public class RepositorioPessoaBDR {

    protected static final String UPDATE_PESSOA = "UPDATE pessoa SET nome = ? ,  rua = ? , numero = ? , complemento = ? , bairro = ? , "
	    + "cidade = ? , cep = ?, uf = ? WHERE cpf = ?";

    protected static final String INSERT_PESSOA = "INSERT INTO pessoa (cpf,nome,rg,"
	    + "rua,numero,complemento,bairro,cidade,cep,uf) VALUES (?,?,?,?,?,?,?,?,?,?)";

    protected static final String CONSULTA_PESSOA = "SELECT * FROM pessoa WHERE cpf = ?";

    protected static final String DELETE_PESSOA = "DELETE FROM pessoa WHERE cpf = ?";

    protected static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";

    protected void alterarPessoa(Pessoa pessoa)
	    throws ErroAcessoRepositorioException {
	PreparedStatement pstmt = null;
	Connection con = Conexao.getConexao();
	try {
	    pstmt = con.prepareStatement(UPDATE_PESSOA);
	    pstmt.setString(1, pessoa.getNome());
	    pstmt.setString(2, pessoa.getEndereco().getRua());
	    pstmt.setString(3, pessoa.getEndereco().getNumero());
	    pstmt.setString(4, pessoa.getEndereco().getComplemento());
	    pstmt.setString(5, pessoa.getEndereco().getBairro());
	    pstmt.setString(6, pessoa.getEndereco().getCidade());
	    pstmt.setString(7, pessoa.getEndereco().getCep());
	    pstmt.setString(8, pessoa.getEndereco().getUf());
	    pstmt.setString(9, pessoa.getCpf());
	    pstmt.executeUpdate();
	} catch (SQLException e) {
	    throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, e, e
		    .getErrorCode());
	} finally {
	    Conexao.fechaRecursos(con, pstmt, null);
	}
    }

    protected void inserePessoa(Pessoa pessoa)
	    throws ErroAcessoRepositorioException {
	PreparedStatement pstmt = null;
	Connection con = Conexao.getConexao();
	if (!existePessoa(pessoa.getCpf())) {
	    con = Conexao.getConexao();
	    try {
		pstmt = con.prepareStatement(INSERT_PESSOA);
		pstmt.setString(1, pessoa.getCpf());
		pstmt.setString(2, pessoa.getNome());
		pstmt.setString(3, pessoa.getRg());
		pstmt.setString(4, pessoa.getEndereco().getRua());
		pstmt.setString(5, pessoa.getEndereco().getNumero());
		pstmt.setString(6, pessoa.getEndereco().getComplemento());
		pstmt.setString(7, pessoa.getEndereco().getBairro());
		pstmt.setString(8, pessoa.getEndereco().getCidade());
		pstmt.setString(9, pessoa.getEndereco().getCep());
		pstmt.setString(10, pessoa.getEndereco().getUf());
		pstmt.executeUpdate();
	    } catch (SQLException e) {
		throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, e,
			e.getErrorCode());
	    } finally {
		Conexao.fechaRecursos(con, pstmt, null);
	    }
	}
    }

    protected boolean existePessoa(String cpf)
	    throws ErroAcessoRepositorioException {
	Connection con = null;
	PreparedStatement pstmt = null;
	con = Conexao.getConexao();
	ResultSet rs = null;
	try {
	    pstmt = con.prepareStatement(CONSULTA_PESSOA);
	    pstmt.setString(1, cpf);
	    rs = pstmt.executeQuery();
	    if (rs.next()) {
		String qtdLinhas = rs.getString(1);
		return (qtdLinhas != null);
	    }
	} catch (SQLException e) {
	    throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, e, e
		    .getErrorCode());
	} finally {
	    Conexao.fechaRecursos(con, pstmt, rs);
	}

	return false;
    }

    protected void excluirPessoa(String cpf)
	    throws ErroAcessoRepositorioException {
	PreparedStatement pstmt = null;
	Connection con = null;
	con = Conexao.getConexao();
	try {
	    pstmt = con.prepareStatement(DELETE_PESSOA);
	    pstmt.setString(1, cpf);
	    pstmt.executeUpdate();
	} catch (SQLException e) {
	    throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, e, e
		    .getErrorCode());
	} finally {
	    Conexao.fechaRecursos(con, pstmt, null);
	}
    }
}
